﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using Entidad;
using System.Data;

namespace DAO
{
    public class LibroDAO : ABMCLibroInterface
    {
        private DAO_v2 dao;
        public LibroDAO()
        {
            dao = new DAO_v2();
        }
        public string CadenaConexion()
        {
            return DAO_v2.MiCadenaConexion();
        }
        public void GuardarLibro(LibroEnt libro)
        {
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
                cn.Open();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                parametros.Add("id_Materia");
                datos.Add(libro.MateriaID);
                parametros.Add("titulo");
                datos.Add(libro.Titulo);
                parametros.Add("id_Editorial");
                datos.Add(libro.EditorialID);
                parametros.Add("cantHojas");
                datos.Add(libro.CantidadHojas);
                parametros.Add("fechaEmision");
                datos.Add(libro.FechaEmision);
                parametros.Add("precioNuevo");
                if (libro.PrecioNuevo.HasValue)
                {
                    datos.Add(libro.PrecioNuevo);
                }
                else
                {
                    datos.Add(DBNull.Value);
                }
                parametros.Add("isbn");
                datos.Add(libro.ISBN);
                SqlCommand cmd = dao.Grabar("Libro", parametros, datos);
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
                
            }
            catch(SqlException ex){
                throw new ApplicationException("Problema al grabar los datos");
            }
            finally{
                if(cn.State == System.Data.ConnectionState.Open){
                    cn.Close();
                }
            }
        }
        public LibroEnt BuscarLibro(Int64 idLibro)
        {
            LibroEnt resultado = new LibroEnt();
            SqlConnection cn = new SqlConnection(CadenaConexion());          
            try
            {
                DAO_v2 dao = new DAO_v2();
                cn.Open();
                List<String> columnas = new List<String>();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                columnas.Add("id_libro");
                columnas.Add("id_materia");
                columnas.Add("titulo");
                columnas.Add("id_editorial");
                columnas.Add("cantHojas");
                columnas.Add("fechaEmision");
                columnas.Add("precioNuevo");
                columnas.Add("ISBN");
                parametros.Add("id_Libro");
                datos.Add(idLibro);
                SqlCommand cmd = dao.Buscar("Libro", columnas, parametros, datos);
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    resultado.IDLibro = int.Parse(dr["id_libro"].ToString());
                    resultado.MateriaID = int.Parse(dr["id_materia"].ToString());
                    resultado.Titulo = dr["titulo"].ToString();
                    resultado.EditorialID = int.Parse(dr["id_editorial"].ToString());
                    resultado.CantidadHojas = int.Parse(dr["cantHojas"].ToString());
                    resultado.FechaEmision = DateTime.Parse(dr["fechaEmision"].ToString());
                    resultado.ISBN = Int64.Parse(dr["ISBN"].ToString());
                    if (dr["precioNuevo"].ToString() != DBNull.Value.ToString())
                    {
                        resultado.PrecioNuevo = double.Parse(dr["precioNuevo"].ToString());
                    }
                    else
                    {
                        resultado.PrecioNuevo = null;
                    }
                }
                return resultado;
            }
            catch(SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al buscar el libro...");
            }
            finally
            {
                if (cn.State == System.Data.ConnectionState.Open)
                {
                    cn.Close();
                }
            }
        }
        public List<LibroEnt> ObtenerTodosLibros()
        {
            List<LibroEnt> resultado = new List<LibroEnt>();
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
                cn.Open();
                List<String> columnas = new List<String>();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                columnas.Add("id_libro");
                columnas.Add("id_materia");
                columnas.Add("titulo");
                columnas.Add("id_editorial");
                columnas.Add("cantHojas");
                columnas.Add("fechaEmision");
                columnas.Add("precioNuevo");
                columnas.Add("ISBN");
                SqlCommand cmd = dao.Buscar("Libro",columnas,parametros,datos);
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    //Creo un objeto del tipo libro traido de la base de datos...
                    LibroEnt libro = new LibroEnt();
                    libro.IDLibro = int.Parse(dr["id_libro"].ToString());
                    libro.MateriaID = int.Parse(dr["id_materia"].ToString());
                    libro.Titulo = dr["titulo"].ToString();
                    libro.EditorialID = int.Parse(dr["id_editorial"].ToString());
                    libro.CantidadHojas = int.Parse(dr["cantHojas"].ToString());
                    libro.FechaEmision = DateTime.Parse(dr["fechaEmision"].ToString());
                    if (dr["precioNuevo"].ToString() != DBNull.Value.ToString())
                    {
                        libro.PrecioNuevo = double.Parse(dr["precioNuevo"].ToString());
                    }
                    else
                    {
                        libro.PrecioNuevo = null;
                    }
                    //Agrego el objeto a la lista resultado...
                    resultado.Add(libro);
                }
            }
            catch
            {
                return null;
                throw new ApplicationException("Error al obtener los libros");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }
            return resultado;
        }
        public void ActualizarLibro(LibroEnt libro)
        {
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
                cn.Open();
                List<String> parametrosSet = new List<String>();
                List<Object> datosSet = new List<Object>();
                List<String> parametrosWhere = new List<String>();
                List<Object> datosWhere = new List<Object>();
                parametrosSet.Add("ID_Materia");
                datosSet.Add(libro.MateriaID);
                parametrosSet.Add("titulo");
                datosSet.Add(libro.Titulo);
                parametrosSet.Add("ID_Editorial");
                datosSet.Add(libro.EditorialID);
                parametrosSet.Add("cantHojas");
                datosSet.Add(libro.CantidadHojas);
                parametrosSet.Add("fechaEmision");
                datosSet.Add(libro.FechaEmision);
                parametrosSet.Add("precioNuevo");
                if (libro.PrecioNuevo.HasValue)
                {
                    datosSet.Add(libro.PrecioNuevo);
                }
                else
                {
                    datosSet.Add(DBNull.Value);
                }
                parametrosSet.Add("ISBN");
                datosSet.Add(libro.ISBN);
                parametrosWhere.Add("id_Libro");
                datosWhere.Add(libro.IDLibro);
                SqlCommand cmd = dao.Actualizar("Libro", parametrosSet, datosSet, parametrosWhere, datosWhere);
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
            }
            catch(SqlException ex)
            {
                throw new ApplicationException("Error al actualizar el libro...");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }
        }
        public bool EliminarLibro(int IDLibro)
        {
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
                cn.Open();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                List<String> columnas = new List<String>();
                columnas.Add("id_Libro");
                parametros.Add("id_Libro");
                datos.Add(IDLibro);
                SqlCommand existe = dao.Buscar("Ejemplar", columnas, parametros, datos);
                existe.Connection = cn;
                if (existe.ExecuteScalar() != null)
                {
                    return false;
                }
                SqlCommand cmd = dao.Eliminar("Libro", parametros, datos);
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (SqlException ex)
            {
                return false;
                throw new ApplicationException("Error al eliminar el Libro...");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }
            
        }
        List<LibroQueryEnt> ABMCLibroInterface.BuscarTodosLibrosQuery(String[] filtros)
        {
            throw new NotImplementedException();
        }
        public LibroEnt BuscarLibroISBN(Int64 ISBN)
        {
            LibroEnt resultado = new LibroEnt();
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
                DAO_v2 dao = new DAO_v2();
                cn.Open();
                List<String> columnas = new List<String>();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                columnas.Add("id_libro");
                columnas.Add("id_materia");
                columnas.Add("titulo");
                columnas.Add("id_editorial");
                columnas.Add("cantHojas");
                columnas.Add("fechaEmision");
                columnas.Add("precioNuevo");
                columnas.Add("ISBN");
                parametros.Add("ISBN");
                datos.Add(ISBN);
                SqlCommand cmd = dao.Buscar("Libro", columnas, parametros, datos);
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    resultado.IDLibro = int.Parse(dr["id_libro"].ToString());
                    resultado.MateriaID = int.Parse(dr["id_materia"].ToString());
                    resultado.Titulo = dr["titulo"].ToString();
                    resultado.EditorialID = int.Parse(dr["id_editorial"].ToString());
                    resultado.CantidadHojas = int.Parse(dr["cantHojas"].ToString());
                    resultado.FechaEmision = DateTime.Parse(dr["fechaEmision"].ToString());
                    resultado.ISBN = Int64.Parse(dr["ISBN"].ToString());
                    if (dr["precioNuevo"].ToString() != DBNull.Value.ToString())
                    {
                        resultado.PrecioNuevo = double.Parse(dr["precioNuevo"].ToString());
                    }
                    else
                    {
                        resultado.PrecioNuevo = null;
                    }
                }
                return resultado;
            }
            catch (SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al buscar el libro...");
            }
            finally
            {
                if (cn.State == System.Data.ConnectionState.Open)
                {
                    cn.Close();
                }
            }
        }


        DataView ABMCLibroInterface.ObtenerTodasEditoriales()
        {
            throw new NotImplementedException();
        }


        public DataView ObtenerTodasMaterias()
        {
            throw new NotImplementedException();
        }


        public List<LibroQueryEnt> BuscarTodosLibrosQuery(string[] filtros)
        {
            throw new NotImplementedException();
        }
    }
}
